# ============================================================================ #
# Makefile для проекта task1  (квантовое преобразование на openmp              #
#                                                                              #
# !!!!!!!!!!!!!!!!!!!!!!! ВАЖНО !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #
#                                                                              #
#   При первом запуске выйдет ОШИБКА при линковке в окончательный модуль!      #
#   Это особенность данной версии Makefile. просто соберите проект еще раз!    #
#                                                                              #
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #
#                                                                              #
#  если интересно в чем ошибка:                                                #
# дело в том, что откомпилированные объектные файлы сохраняются не корневой    #
# каталог, а в папку obj, но утилита make (видимо ее особенность) запоминает   #
# отсутствие файлов в корневом каталоге и потом ищет их только там (хотя опция #
# vpath %.o $(OBJ_NOW) стоит задолго до этого). В будущем исправлю             #
#                                                                              #
# ============================================================================ #


# определение имени программы
PROG = state

# директории
INCLUDE_DIR = include/
SRC_DIR     = src/
LIB_DIR     =

# библиотеки
LIBMODULES :=

# компиляторы
CC            = mpicxx
CFLAGSADD     = -openmp -shared

BIN         = bin
BIN_DEBUG   = $(BIN)/debug
BIN_RELEASE = $(BIN)/release
BIN_NOW     = $(BIN_DEBUG)

OBJ         = obj
OBJ_DEBUG   = $(OBJ)/debug
OBJ_RELEASE = $(OBJ)/release
OBJ_NOW     = $(OBJ_DEBUG)

# =============================================================================
WORK_DIR    = `pwd`
DATE        = `date +%X`

# определение всех имен через директории
SRCMODULES := $(notdir $(wildcard  $(SRC_DIR)/*.cpp))
OBJMODULES := $(SRCMODULES:.cpp=.o)
INCMODULES := $(notdir $(wildcard $(INCLUDE_DIR)/*.h) )

#некоторые автоматические опции
CFLAGSDEBUG   = -g -Wall -pedantic
CFLAGSRELEASE = 
CFLAGSINCLUDE = $(addprefix -I, $(INCLUDE_DIR))
CFLAGSLIB     = $(addprefix -L, $(LIB_DIR)) $(addprefix -l, $(LIBMODULES))
CFLAGS        = $(CFLAGSDEBUG) $(CFLAGSINCLUDE) $(CFLAGSLIB) $(CFLAGSADD)
# =============================================================================
#ifdef NUMBER_PROC
NUMBER_PROC_ARG = -n $(NUMBER_PROC)
#endif

#ifdef NODE
NODE_ARG        = -N $(NODE)
#endif

#ifdef QUEUE
QUEUE_ARG       = -p $(QUEUE)
#endif

#ifdef TIME
TIME_ARG        = -t $(TIME)
#endif

#ifdef OUTPUT
OUTPUT_ARG      = -o $(OUTPUT)
#endif
# =============================================================================

# абстрактные цели
.PHONY: all print clean build rebuild

# пути поиска шаблонов
vpath %.h   $(INCLUDE_DIR)
vpath %.cpp $(SRC_DIR)
vpath %.o   $(OBJ_NOW)

# главная цель 
all: build

build:  $(OBJMODULES)
	$(CC) $(CFLAGS) $^ -o $(BIN_NOW)/lib$(PROG).so
	cp $(BIN_NOW)/lib$(PROG).so .

rebuild: clean build

# отладочная печать 
print:
	@echo $(DATE)

# шаблоны компилирования 
%.o: %.cpp %.h
	$(CC) $(CFLAGS) -c -fPIC $< -o $(OBJ_NOW)/$@

%.o: %.cpp
	$(CC) $(CFLAGS) -c -fPIC $< -o $(OBJ_NOW)/$@

# включение файла зависимостей
ifneq (clean, $(MAKECMDGOALS))
-include deps.mk
endif

# файл зависимостей
deps.mk: $(SRCMODULES)
	$(CC) $(CFLAGSINCLUDE) -MM $^ > $@

# очистка
clean:
	rm -f deps.mk
	rm -f $(OBJ_NOW)/*.o
	rm -f $(BIN_NOW)/lib$(PROG).so
	rm -f lib$(PROG).so
